package com.monkeyboy.manager.redis.redissharded;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

@Service
public class ShardedRedisService {
	@Autowired
	private ShardedJedisPool shardedJedisPool;

	/**
	 * 作用： 根据一个key获取一个value
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @param clazz
	 * @return
	 */
	public <T> T get(String key, Class<T> clazz) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			String str = jedis.get(key);
			T t = stringToBean(str, clazz);
			return t;
		} finally {
			returnToPool(jedis);
		}
	}

	/**
	 * 作用： 设置一个key-value
	 * 成功返回:OK
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @param value
	 * @return
	 */
	public <T> String set(String key, T value) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			String str = beanToString(value);
			if (str == null || str.length() <= 0) {
				return "false";
			}
			return jedis.set(key, str);
		} finally {
			returnToPool(jedis);
		}
	}
	/**
	 *作用：
	 *  删除一个key
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @return 0/1
	 */
	public int del(String key) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			return Integer.valueOf(String.valueOf(jedis.del(key)));
		} finally {
			returnToPool(jedis);
		}
	}
	/**
	 * 作用： 给一个键设置一个过期时间
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @param value
	 * @param expireTime
	 * @return
	 */
	public <T> String setEx(String key, T value, int expireTime) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			String str = beanToString(value);
			if (str == null || str.length() <= 0) {
				return "false";
			}
			if (expireTime <= 0) {
				return "false";
			}
			return jedis.setex(key, expireTime, str);
		} finally {
			returnToPool(jedis);
		}
	}
	/**
	 *作用：
	 * 给一个key设置一个过期时间
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @param seconds
	 * @return 1/0
	 */
	public int expireKey(String key,int seconds) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			return Integer.valueOf(String.valueOf(jedis.expire(key, seconds)));
		} finally {
			returnToPool(jedis);
		}
	}
	/**
	 * 作用： 判断一个key值是否存在
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @return
	 */
	public boolean exitKey(String key) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			return jedis.exists(key);
		} finally {
			returnToPool(jedis);
		}
	}

	/**
	 * 作用： 自减操作
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @return
	 */
	public int decr(String key) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			return Integer.valueOf(String.valueOf(jedis.decr(key)));
		} finally {
			returnToPool(jedis);
		}
	}

	/**
	 * 作用： 自增操作
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param key
	 * @return
	 */
	public int incr(String key) {
		ShardedJedis jedis = null;
		try {
			jedis = shardedJedisPool.getResource();
			return Integer.valueOf(String.valueOf(jedis.incr(key)));
		} finally {
			returnToPool(jedis);
		}
	}

	/**
	 * 作用： 把一个对象转换为字符串的格式
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param value
	 * @return
	 */
	private <T> String beanToString(T value) {
		if (value == null) {
			return null;
		}
		Class<?> clazz = value.getClass();
		if (clazz == int.class || clazz == Integer.class) {
			return "" + value;
		} else if (clazz == String.class) {
			return (String) value;
		} else if (clazz == long.class || clazz == Long.class) {
			return "" + value;
		} else {
			return JSON.toJSONString(value);
		}
	}

	/**
	 * 作用： 把一个字符串转换为一个对象
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param str
	 * @param clazz
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private <T> T stringToBean(String str, Class<T> clazz) {
		if (str == null || str.length() <= 0 || clazz == null) {
			return null;
		}
		if (clazz == int.class || clazz == Integer.class) {
			return (T) Integer.valueOf(str);
		} else if (clazz == String.class) {
			return (T) str;
		} else if (clazz == long.class || clazz == Long.class) {
			return (T) Long.valueOf(str);
		} else {
			return JSON.toJavaObject(JSON.parseObject(str), clazz);
		}
	}

	/**
	 * 作用： 关闭连接池，释放资源
	 * 
	 * @Author:Gavin
	 * @time:2018年10月5日
	 * @param jedis
	 */
	private void returnToPool(ShardedJedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}
}
